package com.common.jane_ai.controller;

import com.common.jane_ai.RepateExecuteLimit.RepateExecuteLimit;
import com.common.jane_ai.constant.JaneTypeConstant;
import com.common.jane_ai.threadlocal.BaseParameterHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

import static com.common.jane_ai.constant.JaneTypeConstant.AUTHORIZATION;
import static com.common.jane_ai.constant.JaneTypeConstant.USER_ID;
@Slf4j
@RestController
@RequestMapping("/jane")
public class JaneController {

    @Autowired
    @Qualifier("chatClient")
    private ChatClient chatClient;

    @Autowired
    @Qualifier("RAG_Pinecone_chatClient")
    private ChatClient rag_Pinecone_chatClient;

    //.stream() ✅ 触发实际的 AI 请求，并以流式响应的方式返回结果。这是真正向 AI 模型发送请求的方法调用。
    //.content() 从流式响应中提取文本内容返回给客户端
    @RepateExecuteLimit(type = JaneTypeConstant.CHAT_MIDENG, chatId = "#chatId", durationTime = 5L)
    @PostMapping(value="/chat",produces = "text/html;charset=utf-8")//浏览器会收到带 Content-Type: text/html;charset=utf-8 的响应，显示网页内容，不会乱码
    public Flux<String> chat(@RequestParam("prompt") String prompt,
                             @RequestParam("chatId") String chatId){
        log.info("REQUEST_CONTROLLER-"+Thread.currentThread().getName());
        // 该方法通过一系列链式调用来构建和发送用户提示，并获取响应内容
        return rag_Pinecone_chatClient.prompt() // 调用chatClient的prompt方法开始构建用户提示
                .user(prompt) // 设置用户提示的内容为prompt
                //你配置一次，多个 advisor 会“监听”自己关心的参数，然后各自执行自己的逻辑。
                .advisors(a->a.param(ChatMemory.CONVERSATION_ID,chatId)
                        .param(USER_ID, BaseParameterHolder.getBaseParameter(USER_ID))
                )//ChatClient 配置逻辑本身没有问题， 但由于在 RedisChatHistoryAdvisor 里使用了
                // BaseParameterHolder依赖 ThreadLocal）而 ChatClient 是基于 Reactor 的异步响应式执行模型，
                // 导致你当前上下文无法传递进 Advisor，从而抛出 NullPointerException。
            //给请求的“增强器”传入一个参数
                .stream() // 流式返回
                .content(); // 从响应对象中提取内容并返回

//        ChatMemoryAdvisor 看到有 conversation_id，它就参与处理
//        AuthAdvisor 看到有 auth_token，它就去校验权限
//        LoggingAdvisor 不关心这些参数，它就跳过了
    }
}
